function main() {		
	var collection;
	var traderColl;
	var docEntry;
	var centry;
	var itemAlterCodeID;
	var itemEntryID;
	var itemAlterCode;
	var codeVal;
    var nameVal;
	var cstmID = null;
	var customer;
	var customerID;
	var customerBranch;
	var traderID;
	var trader;
	var traderBranch;
	var line;
	var actLogger;
	var warnings;
	
	var logger = sc$APIContext.GetActionLogger();

	var dic = sc$Context.JsonDeserialize(sc$APIContext.GetImportBuffer());
	
	
	
	collection = sc$Context.DataObjects.NewMaster("Hercules", "ItemEntries");
	collection.Logic.DisableConstraints();
	docEntry = collection[0];

	docEntry.OperationFlags.Add(docEntry.DentOperationFlagEnum.FillValuesMissing);
	docEntry.OperationFlags.Add(docEntry.DentOperationFlagEnum.AddKitItemLines);
	centry = docEntry.WentEntries[0];
	
	docEntry.SetValue("SourceType", 1);
	//centry.SetValue("CmdtType", 2);		// sales orders
		

	if (dic["DocCode"] != null) {
		docEntry.SetValue("DocCode", dic["DocCode"]);
	}
	if (dic["DocNumber"] != null) {
		docEntry.SetValue("DocNum", dic["DocNumber"]);
	}
	
	if (dic["SeriesCode"] != null || dic["SeriesShortcut"] != null) {
        var seriesCode = null;
		var seriesShcut = null;
		
		if (dic["SeriesCode"] != null) {
			seriesCode = dic["SeriesCode"];
		}
		if (dic["SeriesShortcut"] != null) {
			seriesShcut = dic["SeriesShortcut"];
		}
		var seriesID = sc$ApplImportScript.FindItemEntriesSeries(seriesCode, seriesShcut);
		if (seriesID != null) {
			docEntry.SetValue("DcsrID", seriesID);
		}
		else {
			sc$ApplImportScript.RaiseError(60, seriesCode, seriesShcut, dic["@@Signature"]);
		}
    }
	
	
	
	docEntry.SetValue("CompID", sc$Application.CurrentCompanyID);
	
	var cmbrID = dic["BraID"];
	if (cmbrID != null) {
		docEntry.SetValue("CmbrID", cmbrID);
	}
	var cbwhID = dic["WarID"];
	if (cbwhID != null) {
		centry.SetValue("CbwhID1", cbwhID);
	}
	var TpurID = dic["TransportPurposeID"];
	if (TpurID != null) {
		centry.SetValue("TpurID", TpurID);
	}

	var cmbrID2 = dic["BraID2"];
	if (cmbrID2 != null) {
		centry.SetValue("CmbrID2", cmbrID2);
	}
	var cbwhID2 = dic["WarID2"];
	if (cbwhID2 != null) {		
		centry.SetValue("CbwhID2", cbwhID2);
	}
	//return sc$Context.JsonSerialize(cbwhID2);	
	
	var dicLines = sc$Context.JsonDeserialize(dic["Lines"]);

	for (var i = 0; i < dicLines.Count; i++) {
	
		itemAlterCodeID = null;
		itemEntryID = null;
		codeVal = null;
		nameVal = null;
		
		line = centry.Lines.New();	
		centry.Lines.Add(line);

		if (dicLines[i]["CenlItemCode"] != null || dicLines[i]["CenlItemName"] != null) {	
			codeVal = null;
			nameVal = null;		
			if (dicLines[i]["CenlItemCode"] != null) {				
				var fieldsCode : Array = ["heCode"];
				var valsCode : Array = [dicLines[i]["CenlItemCode"]];
				codeVal = dicLines[i]["CenlItemCode"];
				itemEntryID = sc$ApplImportScript.FindItemsOrServicesRecord(fieldsCode, valsCode, "heID");
			}
			else if (dicLines[i]["CenlItemName"] != null) {
				var fieldsDesc : Array = ["heName"];
				var valsDesc : Array = [dicLines[i]["CenlItemName"]];
				nameVal = dicLines[i]["CenlItemName"];
				itemEntryID = sc$ApplImportScript.FindItemsOrServicesRecord(fieldsDesc, valsDesc, "heID");
			}
			if (itemEntryID != null) {
				line.SetValue("ItemID", itemEntryID);
			}
		}
		if (itemEntryID != null) {
			if (dicLines[i]["CenlItemAlterCode"] !== undefined) {
				var fieldsItemAndAlterCode = ["heItemID", "heCode"];
				var valsItemAndAlterCode = [itemEntryID, dicLines[i]["CenlItemAlterCode"]];
				
				itemAlterCode = dicLines[i]["CenlItemAlterCode"];
				
				// Check whether the itemID and itemAlterCode pair exists only once
				itemAlterCodeID = sc$ApplImportScript.FindRecord("heItemAlterCodes", false, fieldsItemAndAlterCode, valsItemAndAlterCode, "heID");
				if (itemAlterCodeID != null) {
					line.SetValue("ItemID", itemEntryID);	
					line.SetValue("ItacID", itemAlterCodeID);
				}	
				else {
					sc$ApplImportScript.RaiseError(29, codeVal, nameVal, null, null, itemAlterCode, dicLines[i]["@@Signature"]);
				}
			}
		} else {
			if (dicLines[i]["CenlItemAlterCode"] !== undefined) {
				var fieldsAlterCode = ["heCode"];
				var valsAlterCode = [dicLines[i]["CenlItemAlterCode"]];
				
				itemAlterCode = dicLines[i]["CenlItemAlterCode"];
				
				// Check whether itemAlterCode exists only once
				itemAlterCodeID = sc$ApplImportScript.FindRecord("heItemAlterCodes", false, fieldsAlterCode, valsAlterCode, "heID");
				if (itemAlterCodeID != null) {
					line.SetValue("ItacID", itemAlterCodeID);
				}
				else {
					sc$ApplImportScript.RaiseError(30, itemAlterCode, dicLines[i]["@@Signature"]);
				}
			} else {
				sc$ApplImportScript.RaiseError(28, codeVal, nameVal);
			}
		}
	
		
		if (dicLines[i]["CenlAMeasurementQty"] != null) {
			line.SetValue("AQty", dicLines[i]["CenlAMeasurementQty"]);
		}		
		
		line.EndEdit();
	}
	
	centry.EndEdit();	
	docEntry.EndEdit();
	
	sc$Context.DataObjects.ExternalDataFix("Hercules", "ItemEntries", collection);
	actLogger = sc$ApplImportScript.SaveFromImport("Hercules", "ItemEntries", collection);
	logger.Merge(actLogger);
	
	var outDic = new scDictionary();
	outDic["Cookie"]  = sc$APIContext.GetCookie();
	outDic["EntityId"] = docEntry.ID;
	outDic["Messages"] = logger;

	return sc$Context.JsonSerialize(outDic);
}

function FindLookupItem(codeVal, nameVal, lookupTable, propName, entity, lookupVersion) {	
	var recID = sc$ApplImportScript.FindArrayCodeNameRecord(lookupTable, codeVal, nameVal, lookupVersion);	
	if (recID != null) {		
		entity.SetValue(propName, recID); 
	}
}